#include <iostream>
#include <thread>
#include <chrono>
#include <exception>

void doWork() {
    std::cout << "Thread is running..." << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(5)); // 模拟更长时间的耗时操作
}

int main() {
    std::thread t(doWork);

    // 选择使用 join 等待线程完成
    // t.join(); // 取消注释以防止程序异常终止

    // 或者选择 detach 让线程独立于主线程之外运行
    // t.detach(); // 取消注释以防止程序异常终止

    // 如果不调用 join 或 detach，程序将在析构 t 时调用 std::terminate，因为 t 仍拥有一个活跃的线程

    // 设置 std::terminate 的自定义处理器
    std::set_terminate([]() {
        std::cerr << "Terminate handler called" << std::endl;
        abort();  // 强制结束程序
    });

    // 允许主线程继续运行一段时间
    std::this_thread::sleep_for(std::chrono::seconds(2));

    // 主线程完成工作，尝试退出
    // 注意：这里故意没有调用 t.join() 或 t.detach()
    // 线程在2秒后结束并退出，整个程序和所有属于它的线程也都会结束。
    return 0;
}
